import {isNone} from '@/common'

/**
 * 简单数据类型名称字符串常量对象
 */
export const SimpleTypeConst = {
  INT: 'int',
  FLOAT: 'float',
  BOOL: 'bool',
  STRING: 'string',
  DATE: 'date',
  BIGINT: 'bigint',
} as const


/**
 * 简单数据类型名称类型
 */
export type SimpleType = typeof SimpleTypeConst[keyof typeof SimpleTypeConst]


/**
 * 将指定数据转换为目标数据类型
 *
 * @template T 目标数据类型
 * @param {any} data 原始数据
 * @param {SimpleType} targetType 目标数据类型，默认为 'string'
 * @returns {T} 转换后的数据
 * @throws {Error} 如果转换失败或目标类型不支持
 */
export const simpleTypeConvert = <T>(data: any, targetType: SimpleType = SimpleTypeConst.STRING): T => {
  // 如果传入的数据为 null 或 undefined，则直接返回
  if (isNone(data)) return data as T
  // 根据目标数据类型进行转换
  switch (targetType) {
    case SimpleTypeConst.INT: {
      const parsed = parseInt(data, 10)
      if (isNaN(parsed)) throw new Error(`无法将数据 "${data}" 转换为整数`)
      return parsed as T
    }
    case SimpleTypeConst.FLOAT: {
      const parsed = parseFloat(data)
      if (isNaN(parsed)) throw new Error(`无法将数据 "${data}" 转换为浮点数`)
      return parsed as T
    }
    case SimpleTypeConst.BOOL:
      return (!!data) as T
    case SimpleTypeConst.STRING:
      return String(data) as T
    case SimpleTypeConst.DATE: {
      const parsed = new Date(data);
      if (isNaN(parsed.getTime())) throw new Error(`无法将数据 "${data}" 转换为日期`)
      return parsed as T
    }
    case SimpleTypeConst.BIGINT: {
      try {
        return BigInt(data) as T
      } catch (error) {
        throw new Error(`无法将数据 "${data}" 转换为大整数`)
      }
    }
    default:
      throw new Error(`不支持当前目标类型: ${targetType}`)
  }
}
